"""
真空监控模块

该模块实现了RFQ系统的真空监控功能，用于监控腔体和耦合器的真空状态。
主要功能包括：
1. 实时监控多个区域的真空度
2. 真空状态评估和报警
3. 真空异常检测和处理

监控区域：
- 腔体真空
- 耦合器1-4真空

监控流程：
1. 实时采集各区域真空值
2. 与预设阈值比较
3. 评估整体真空状态
4. 异常情况报警

使用示例：
    monitor = VacuumMonitor(pv_manager, vacuum_threshold=1.5e-5)
    status = monitor.get_vacuum_status()
"""

from typing import Dict, Any
from epics import PV

class VacuumMonitor:
    """
    真空监控类
    
    负责监控RFQ系统各个区域的真空状态，包括腔体和耦合器。
    通过PV回调机制实时监控真空值，并在异常情况下发出警告。
    
    主要功能：
    1. 真空值监控
       - 实时采集各区域真空值
       - 检查PV连接状态
       - 验证数据有效性
    
    2. 状态评估
       - 与阈值比较
       - 评估整体状态
       - 异常情况检测
    
    3. 报警处理
       - 异常状态报警
       - 状态变化通知
       - 错误处理
    
    属性：
        pv_manager: PV管理器实例
        vacuum_threshold: 真空阈值
        vacuum_status: 当前真空状态
        vacuum_warning_issued: 是否已发出警告
    
    方法：
        on_vacuum_change(): 处理真空值变化
        get_vacuum_status(): 获取当前真空状态
    """
    
    def __init__(self, pv_manager, vacuum_threshold: float):
        """
        初始化真空监控器
        
        设置PV回调并初始化监控状态。
        
        Args:
            pv_manager: PV管理器实例，用于访问真空PV
            vacuum_threshold: 真空阈值，单位：mbar
        """
        self.pv_manager = pv_manager
        self.vacuum_threshold = vacuum_threshold
        self.vacuum_status = 0
        self.vacuum_warning_issued = False
        
        # 设置真空PV回调
        vacuum_pvs = [
            'cavity_vacuum',    # RFQ_VAC:VG_01:Pres_Rd
            'coupler1_vacuum',  # RFQ_VAC:CP_05:Pres_Rd
            'coupler2_vacuum',  # RFQ_VAC:CP_06:Pres_Rd
            'coupler3_vacuum',  # RFQ_VAC:CP_04:Pres_Rd
            'coupler4_vacuum'   # RFQ_VAC:CP_01:Pres_Rd
        ]
        for pv_name in vacuum_pvs:
            self.pv_manager.set_callback(pv_name, self.on_vacuum_change)
            
    def on_vacuum_change(self, *args, **kwargs) -> None:
        """
        真空值变化回调函数
        
        处理真空PV值变化事件，评估真空状态。
        检查所有真空区域的PV连接状态和数值有效性，
        并与阈值比较以确定整体真空状态。
        
        处理流程：
        1. 检查PV连接状态
        2. 验证数据有效性
        3. 评估真空状态
        4. 处理异常情况
        
        Args:
            *args: 可变位置参数
            **kwargs: 可变关键字参数
        """
        try:
            # 检查所有真空PV是否都已连接
            vacuum_pvs = [
                'cavity_vacuum',    # RFQ_VAC:VG_01:Pres_Rd
                'coupler1_vacuum',  # RFQ_VAC:CP_05:Pres_Rd
                'coupler2_vacuum',  # RFQ_VAC:CP_06:Pres_Rd
                'coupler3_vacuum',  # RFQ_VAC:CP_04:Pres_Rd
                'coupler4_vacuum'   # RFQ_VAC:CP_01:Pres_Rd
            ]
            
            if not all(self.pv_manager.get_pv(pv).connected for pv in vacuum_pvs):
                print("部分真空PV尚未连接，等待连接...")
                return
                
            # 检查所有PV是否有有效值
            if any(self.pv_manager.get_pv(pv).value is None for pv in vacuum_pvs):
                print("部分真空PV值无效，等待有效值...")
                return
                
            # 检查所有真空值是否低于阈值
            if all(self.pv_manager.get_pv(pv).value < self.vacuum_threshold 
                  for pv in vacuum_pvs):
                self.vacuum_status = 1
                self.vacuum_warning_issued = False
            else:
                if not self.vacuum_warning_issued:
                    print('真空状态异常')
                    self.vacuum_warning_issued = True
                self.vacuum_status = 0
                
        except Exception as e:
            print(f"真空监控回调发生错误: {str(e)}")
            self.vacuum_status = 0
            
    def get_vacuum_status(self) -> int:
        """
        获取真空状态
        
        返回当前系统的真空状态。
        
        Returns:
            int: 真空状态
                1: 正常（所有区域真空度低于阈值）
                0: 异常（任一区域真空度高于阈值）
        """
        return self.vacuum_status 